package xyz.lwm.lazycat.web.handle;


import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * multipart
 *
 * @author lwm
 */
public interface Multipart {

    /**
     * 获取所有属性的集合
     *
     * @return 所有属性的集合
     */
    Map<String, List<String>> getParamListMap();

    /**
     * @return 获得参数名集合
     */
    Set<String> getParamNames();

    /**
     * 返回单一参数值，如果有多个只返回第一个
     *
     * @param paramName 参数名
     * @return null未找到，否则返回值
     */
    String getParam(String paramName);

    /**
     * 获得集合表单值
     *
     * @param paramName 参数名
     * @return 数组表单值
     */
    List<String> getListParam(String paramName);

    /**
     * 获取文件映射
     *
     * @return 文件映射
     */
    Map<String, List<File>> getFileListMap();

    /**
     * 获得某个属性名的所有文件<br>
     * 当表单中两个文件使用同一个name的时候
     *
     * @param paramName 属性名
     * @return 上传的文件列表
     */
    File getFile(String paramName);

    /**
     * 获取上传的文件属性名集合
     *
     * @return 上传的文件属性名集合
     */
    Set<String> getFileParamNames();

    /**
     * 获得某个属性名的所有文件<br>
     * 当表单中两个文件使用同一个name的时候
     *
     * @param paramName 属性名
     * @return 上传的文件列表
     */
    List<File> getFileList(String paramName);

    /**
     * 是否已被解析
     *
     * @return 如果流已被解析返回true
     */
    boolean isLoaded();

    /**
     * multipart file
     */
    interface File {

        /**
         * @return 文件名
         */
        String getFileName();

        /**
         * @return 上传文件的大小，&gt; 0 表示未上传
         */
        long size();

        /**
         * @return 是否上传成功
         */
        boolean isUploaded();

        /**
         * @return 获得文件字节流
         * @throws java.io.IOException IO异常
         */
        byte[] getFileContent() throws IOException;

        /**
         * @return 获得文件流
         * @throws java.io.IOException IO异常
         */
        InputStream getInputStream() throws IOException;

    }

}
